package com.ttg.common.utils;

import java.util.Map;

/**
 * Description： 仅处理键和值均为字符串的 Map，输出为单层 JSON 对象（不包含嵌套对象或数组）
 * Author: chenyou
 * Date: 2025/11/3 11:35
 * Company: ttg
 * Copyright: Copyright (c) 2025
 */
public class MapToJsonHelper {
    public static String mapToJson(Map<String, String> map) {
        if (map == null) {
            return "null";
        }
        if (map.isEmpty()) {
            return "{}";
        }

        StringBuffer buf = new StringBuffer(map.size() << 4); // 预估容量，减少扩容
        buf.append('{');
        boolean first = true;
        for (Map.Entry<String, String> e : map.entrySet()) {
            if (!first) {
                buf.append(',');
            }
            appendJsonString(buf, e.getKey());
            buf.append(':');
            appendJsonString(buf, e.getValue());
            first = false;
        }
        buf.append('}');
        return buf.toString();
    }

    // 转义字符串并追加到缓冲区：输出为 "str" 形式
    private static void appendJsonString(StringBuffer buf, String s) {
        if (s == null) {
            buf.append("null");
            return;
        }
        buf.append('"');
        for (int i = 0, len = s.length(); i < len; i++) {
            char c = s.charAt(i);
            switch (c) {
                case '"':  buf.append("\\\""); break;
                case '\\': buf.append("\\\\"); break;
                case '\b': buf.append("\\b");  break;
                case '\f': buf.append("\\f");  break;
                case '\n': buf.append("\\n");  break;
                case '\r': buf.append("\\r");  break;
                case '\t': buf.append("\\t");  break;
                default:
                    // 控制字符（除了 \t\n\r\b\f）与 0x20 以下的非 ASCII 都需要转义
                    if (c <= '\u001F' || (c >= '\u007F' && c <= '\u009F') || c == '\u2028' || c == '\u2029') {
                        buf.append(String.format("\\u%04x", (int) c));
                    } else {
                        buf.append(c);
                    }
            }
        }
        buf.append('"');
    }
}
